{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TMM Demonstration Using Fabry Perot Etalon\n",
    "TMM is the foundation of RCWA so we first set up all the infrastructure to do TMM\n",
    "using scattering matrices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import sys\n",
    "module_path = os.path.abspath(os.path.join('..'))\n",
    "if module_path not in sys.path:\n",
    "    sys.path.append(module_path)\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt;\n",
    "import cmath;\n",
    "from TMM_functions import PQ_matrices as pq\n",
    "from TMM_functions import scatter_matrices as sm\n",
    "from TMM_functions import redheffer_star as rs\n",
    "from TMM_functions import generate_initial_conditions as ic\n",
    "from scipy import linalg as LA\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------incident wave paramters----------------\n",
      "incident n_i: 1.0\n",
      "kx_inc: 0.8660254037844386 ky_inc: 0.0\n",
      "kz_inc: (0.5000000000000001+0j)\n",
      "-----------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "'''\n",
    "raw TMM formalism using scattering matrices using a single silicon slab (should see Fabry-Perot)\n",
    "'''\n",
    "\n",
    "#%% DEFINE SIMULATION PARAMETERS\n",
    "# TMM CAN FAIL IF KZ = 0 IN ANY MEDIA, which should be unlikely if kz != 0 in incident media\n",
    "\n",
    "#% General Units\n",
    "degrees = np.pi/180;\n",
    "L0 = 1e-6; #units of microns;\n",
    "eps0 = 8.854e-12;\n",
    "mu0 = 4*np.pi*10**-7;\n",
    "c0 = 1/(np.sqrt(mu0*eps0))\n",
    "I = np.matrix(np.eye(2,2)); #unit 2x2 matrix\n",
    "\n",
    "\n",
    "## normalized units\n",
    "#z' = k0*z;\n",
    "#k = k/k0;\n",
    "\n",
    "## REFLECTION AND TRANSMSSION SPACE epsilon and mu PARAMETERS\n",
    "m_r = 1; e_r = 1;\n",
    "m_t = 1; e_t = 1;\n",
    "\n",
    "## set wavelength scanning range\n",
    "wavelengths = L0*np.linspace(0.5,2,1000); #500 nm to 1000 nm\n",
    "kmagnitude_scan = 2 * np.pi / wavelengths; #no\n",
    "omega = c0 * kmagnitude_scan; #using the dispersion wavelengths\n",
    "\n",
    "thickness_slab = 0.76*L0; #100 nm;\n",
    "#source parameters\n",
    "theta = 60 * degrees; #%elevation angle\n",
    "phi = 0 * degrees; #%azimuthal angle\n",
    "\n",
    "## incident wave properties, at this point, everything is in units of k_0\n",
    "n_i = np.sqrt(e_r*m_r);\n",
    "\n",
    "#k0 = np.sqrt(kx**2+ky**2+kz**2); we know k0, theta, and phi\n",
    "\n",
    "#actually, in the definitions here, kx = k0*sin(theta)*cos(phi), so kx, ky here are normalized\n",
    "kx = n_i*np.sin(theta)*np.cos(phi); #constant in ALL LAYERS; kx = 0 for normal incidence\n",
    "ky = n_i*np.sin(theta)*np.sin(phi); #constant in ALL LAYERS; ky = 0 for normal incidence\n",
    "kz_inc = cmath.sqrt(e_r * m_r - kx ** 2 - ky ** 2);\n",
    "\n",
    "normal_vector = np.array([0, 0, -1]) #positive z points down;\n",
    "ate_vector = np.matrix([0, 1, 0]); #vector for the out of plane E-field\n",
    "#ampltidue of the te vs tm modes (which are decoupled)\n",
    "# pte = 1/np.sqrt(2);\n",
    "# ptm = cmath.sqrt(-1)/np.sqrt(2);\n",
    "pte = 1;\n",
    "ptm = 0;\n",
    "print('--------incident wave paramters----------------')\n",
    "print('incident n_i: '+str(n_i))\n",
    "print('kx_inc: '+str(kx)+' ky_inc: '+str(ky))\n",
    "print('kz_inc: ' + str(kz_inc));\n",
    "print('-----------------------------------------------')\n",
    "\n",
    "\n",
    "## specify gap media\n",
    "e_h = 1; m_h = 1;\n",
    "Pg, Qg, kzg = pq.P_Q_kz(kx, ky, e_h, m_h)\n",
    "Wg = I; #Wg should be the eigenmodes of the E field, which paparently is the identity, yes for a homogeneous medium\n",
    "sqrt_lambda = cmath.sqrt(-1)*Wg;\n",
    "# remember Vg is really Qg*(Omg)^-1; Vg is the eigenmodes of the H fields\n",
    "Vg = Qg*Wg*(sqrt_lambda)**-1;\n",
    "\n",
    "#thickness 0 means L = 0, which only pops up in the xponential part of the expression\n",
    "ER = [12];\n",
    "UR = [1];\n",
    "layer_thicknesses = [thickness_slab, thickness_slab]; #this retains SI unit convention\n",
    "ref = list(); trans = list();\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "for i in range(len(wavelengths)): #in SI units\n",
    "    ## initialize global scattering matrix: should be a 4x4 identity so when we start the redheffer star, we get I*SR\n",
    "\n",
    "    Sg11 = np.matrix(np.zeros((2, 2)));\n",
    "    Sg12 = np.matrix(np.eye(2, 2));\n",
    "    Sg21 = np.matrix(np.eye(2, 2));\n",
    "    Sg22 = np.matrix(np.zeros((2, 2)));  # matrices\n",
    "    Sg = np.block([[Sg11, Sg12], [Sg21, Sg22]]);  # initialization is equivelant as that for S_reflection side matrix\n",
    "    Sg0 = Sg;\n",
    "\n",
    "    ### ================= Working on the Reflection Side =========== ##\n",
    "    Pr, Qr, kzr = pq.P_Q_kz(kx, ky, e_r, m_r)\n",
    "\n",
    "    ## ============== values to keep track of =======================##\n",
    "    S_matrices = list();\n",
    "    kz_storage = [kzr];\n",
    "    X_storage = list();\n",
    "    ## ==============================================================##\n",
    "\n",
    "    # define vacuum wavevector k0\n",
    "    k0 = kmagnitude_scan[i]; #this is in SI units, it is the normalization constant for the k-vector\n",
    "    lam0 = wavelengths[i]; #k0 and lam0 are related by 2*pi/lam0 = k0\n",
    "\n",
    "    ## modes of the layer\n",
    "    Om_r = np.matrix(cmath.sqrt(-1) * kzr * I);\n",
    "    X_storage.append(Om_r);\n",
    "    W_ref = I;\n",
    "    V_ref = Qr * Om_r.I; #can't play games with V like with W because matrices for V are complex\n",
    "\n",
    "    ## calculating A and B matrices for scattering matrix\n",
    "    Ar, Br = sm.A_B_matrices(Wg, W_ref, Vg, V_ref);\n",
    "\n",
    "    S_ref, Sr_dict = sm.S_R(Ar, Br); #scatter matrix for the reflection region\n",
    "    S_matrices.append(S_ref);\n",
    "    Sg, D_r, F_r = rs.RedhefferStar(Sg, S_ref);\n",
    "\n",
    "    Q_storage = list(); P_storage=  list();\n",
    "    ## go through the layers\n",
    "    for i in range(len(ER)):\n",
    "        #ith layer material parameters\n",
    "        e = ER[i]; m = UR[i];\n",
    "\n",
    "        #longitudinal k_vector\n",
    "        P, Q, kzl = pq.P_Q_kz(kx, ky, e, m)\n",
    "        kz_storage.append(kzl)\n",
    "\n",
    "        ## E-field modes that can propagate in the medium\n",
    "        W_i = I;\n",
    "        ## corresponding H-field modes.\n",
    "        Om = cmath.sqrt(-1) * kzl * I; X_storage.append(Om)\n",
    "        V_i = Q * np.linalg.inv(Om);\n",
    "\n",
    "        #now defIne A and B\n",
    "        A,B = sm.A_B_matrices(Wg, W_i, Vg, V_i);\n",
    "\n",
    "        #calculate scattering matrix\n",
    "        S_layer, Sl_dict = sm.S_layer(A, B, layer_thicknesses[i], k0, Om)\n",
    "        S_matrices.append(S_layer);\n",
    "\n",
    "        ## update global scattering matrix using redheffer star\n",
    "        Sg, D_i, F_i = rs.RedhefferStar(Sg, S_layer);\n",
    "\n",
    "    ##========= Working on the Transmission Side==============##\n",
    "    Pt, Qt, kz_trans = pq.P_Q_kz(kx, ky, e_t, m_t);kz_storage.append(kz_trans);\n",
    "\n",
    "    Om = cmath.sqrt(-1) * kz_trans * I;\n",
    "    Vt = Qt*np.linalg.inv(Om);\n",
    "\n",
    "    #get At, Bt\n",
    "    At, Bt = sm.A_B_matrices(Wg, I, Vg, Vt)\n",
    "\n",
    "    ST, ST_dict = sm.S_T(At, Bt)\n",
    "    S_matrices.append(ST);\n",
    "    #update global scattering matrix\n",
    "    Sg, D_t, F_t = rs.RedhefferStar(Sg, ST);\n",
    "\n",
    "    K_inc_vector = n_i * k0*np.matrix([np.sin(theta) * np.cos(phi), \\\n",
    "                                    np.sin(theta) * np.sin(phi), np.cos(theta)]);\n",
    "\n",
    "    # cinc is the c1+\n",
    "    E_inc, cinc, Polarization = ic.initial_conditions(K_inc_vector, theta,  normal_vector, pte, ptm)\n",
    "\n",
    "    ## COMPUTE FIELDS\n",
    "    Er = Sg[0:2,0:2]*cinc; #S11; #(cinc = initial mode amplitudes), cout = Sg*cinc; #2d because Ex, Ey...\n",
    "    Et = Sg[2:,0:2]*cinc;  #S21\n",
    "\n",
    "    Er = np.squeeze(np.asarray(Er));\n",
    "    Et = np.squeeze(np.asarray(Et));\n",
    "\n",
    "    Erx = Er[0]; Ery = Er[1];\n",
    "    Etx = Et[0]; Ety = Et[1];\n",
    "\n",
    "    # apply the grad(E) = 0 equation to get z components\n",
    "    Erz = -(kx*Erx+ky*Ery)/kzr;\n",
    "    Etz = -(kx*Etx+ky*Ety)/kz_trans; ## using divergence of E equation here\n",
    "\n",
    "    #add in the Erz component to vectors\n",
    "    Er = np.matrix([Erx, Ery, Erz]); #a vector\n",
    "    Et = np.matrix([Etx, Ety, Etz]);\n",
    "\n",
    "    R = np.linalg.norm(Er)**2;\n",
    "    T = np.linalg.norm(Et)**2;\n",
    "    ref.append(R);\n",
    "    trans.append(T);\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5.795571396982501e-17\n",
      "2.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1c1996c8828>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "2.2110831935702664\n",
      "1\n",
      "2.019771781742534\n",
      "2\n",
      "2.0\n",
      "0.0\n",
      "[[ 9.60e-01-0.04j  0.00e+00+0.j   -1.18e-02-0.28j  0.00e+00+0.j  ]\n",
      " [ 0.00e+00+0.j    9.97e-01-0.01j  0.00e+00+0.j   -8.72e-04-0.08j]\n",
      " [-1.18e-02-0.28j  0.00e+00+0.j    9.60e-01-0.04j  0.00e+00+0.j  ]\n",
      " [ 0.00e+00+0.j   -8.72e-04-0.08j  0.00e+00+0.j    9.97e-01-0.01j]]\n",
      "[[ 9.60e-01-0.04j  0.00e+00+0.j   -1.18e-02-0.28j  0.00e+00+0.j  ]\n",
      " [ 0.00e+00+0.j    9.97e-01-0.01j  0.00e+00+0.j   -8.72e-04-0.08j]\n",
      " [-1.18e-02-0.28j  0.00e+00+0.j    9.60e-01-0.04j  0.00e+00+0.j  ]\n",
      " [ 0.00e+00+0.j   -8.72e-04-0.08j  0.00e+00+0.j    9.97e-01-0.01j]]\n"
     ]
    }
   ],
   "source": [
    "## check that Sg is unitary (medium is lossless)\n",
    "check = Sg*Sg.I;\n",
    "print(np.linalg.norm(np.eye(4,4)-check))\n",
    "#Sg is also supposed to be unitary\n",
    "print(np.linalg.norm(Sg))\n",
    "\n",
    "## BASIC PLOTTING\n",
    "ref = np.array(ref);\n",
    "trans = np.array(trans)\n",
    "plt.figure();\n",
    "plt.plot(wavelengths/L0, ref);\n",
    "plt.plot(wavelengths/L0, trans);\n",
    "plt.legend(['R', 'T'])\n",
    "plt.xlabel('wavelength (um)')\n",
    "plt.show()\n",
    "\n",
    "# def fsr(ng, l1, theta, lambda_0):\n",
    "#     return lambda_0**2/(2*ng*l1*np.cos(theta)+lambda_0)\n",
    "\n",
    "## calculate global S after the loop\n",
    "S1 = Sg0;\n",
    "for i in range(0, len(S_matrices)):\n",
    "    print(i);\n",
    "    S1, D,F = rs.RedhefferStar(S1, S_matrices[i]);\n",
    "    print(np.linalg.norm(S1))\n",
    "\n",
    "#check that S1 and Sg match\n",
    "print(np.linalg.norm(S1-Sg))\n",
    "np.set_printoptions(precision=2)\n",
    "print(S1)\n",
    "print(Sg)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Comparison with Analytic Expression\n",
    "We use the impedance model\n",
    "The impedance of a medium is:\n",
    "$$\n",
    "Z_{0,TM}^{(i)} = \\sqrt{\\frac{\\mu}{\\epsilon}}\\frac{1}{cos(\\theta)}\n",
    "$$\n",
    "This is for the TM polarization\n",
    "\n",
    "For the other polarization, we have\n",
    "$$\n",
    "Z_{0,TE}^{(i)} = \\sqrt{\\frac{\\mu}{\\epsilon}}cos(\\theta)\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "def Fabry_Perot_Spectra_Analytic(wavelengths, e_r, slab_thickness, theta):\n",
    "    '''\n",
    "    source is based in EE236 guided waves by Prof. Shanhui Fan\n",
    "    no need for a lattice constant\n",
    "    :param wavelengths SI units of meters:\n",
    "    :param e_r (usually between 1 and 12)\n",
    "    :param slab_thickness SI units of meters\n",
    "    :param theta = angle in degrees\n",
    "    :return:\n",
    "    '''\n",
    "    degrees = np.pi / 180;\n",
    "    angle_term = np.cos(theta*degrees)\n",
    "    ## 1/cos(theta) is TM, cos(theta) is TE\n",
    "    \n",
    "    print(angle_term)\n",
    "    eps0 = 8.854e-12;\n",
    "    mu0 = 4 * np.pi *1e-7;\n",
    "    ## reflection and transmission materials\n",
    "    Z_1 = np.sqrt(mu0/eps0)*angle_term; #incident\n",
    "    Z_3 = np.sqrt(mu0/eps0)*angle_term\n",
    "    \n",
    "    #do we need to calculate angle in the slab medium using Snell's law?\n",
    "    \n",
    "    # slab specifications\n",
    "    l1 = slab_thickness;\n",
    "    Z_2 = np.sqrt(mu0/eps0)*(1/e_r**0.5); #medium impedance\n",
    "\n",
    "    ## define intermediate variables for impedance transform\n",
    "\n",
    "    im = cmath.sqrt(-1);\n",
    "    ref = list();\n",
    "    trans = list()\n",
    "    ## specify wavelength range to do plotting\n",
    "\n",
    "    for lam0 in wavelengths:\n",
    "        kz = (e_r)**0.5*2*np.pi/lam0; #assuming normal incidence\n",
    "        Zd = Z_2*(Z_3 - im*Z_2*np.tan(kz*l1))/(Z_2 - im*Z_3*np.tan(kz*l1))\n",
    "        r = (Zd - Z_1)/(Zd+Z_1);\n",
    "        ref.append(abs(r)**2);\n",
    "        trans.append(1-abs(r)**2);\n",
    "\n",
    "    return ref, trans\n",
    "\n",
    "    '''\n",
    "    behavior of the analytic model depends on where the angle term is (numerator vs denominator)\n",
    "    '''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5000000000000001\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1c1995afdd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "wavelengths = L0*np.linspace(0.5,2,1000); #500 nm to 1000 nm\n",
    "slab_thickness = 0.76*1e-6;\n",
    "e_r = 12;\n",
    "theta = 60;\n",
    "\n",
    "ref, trans = Fabry_Perot_Spectra_Analytic(wavelengths, e_r, slab_thickness, theta)\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(wavelengths*1e6, ref);\n",
    "plt.plot(wavelengths*1e6, trans);\n",
    "plt.xlabel('wavelength (um)')\n",
    "plt.legend(('reflection', 'transmission'))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Off normal incidence\n",
    "At off normal incidence, a fabry perot slab becomes a narrow band pass filter\n",
    "that is, if you run the code at off-normal incidence, you will actually see that th reflection becomes better and better...and more broad-band, which is quite amazing\n",
    "In fact, because of this, many dielectric structures become very broad-band at extreme off normal incidence (i.e. the bragg mirror)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Second Analytic Model for Fabry Perot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
